/**
 * 
 */
package mx.com.asteca.persistencia.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import mx.com.asteca.persistencia.PersistenciaException;
import mx.com.asteca.persistencia.dao.PersonaDAO;
import mx.com.asteca.persistencia.entidades.Administrativos;
import mx.com.asteca.persistencia.entidades.Alumnos;
import mx.com.asteca.persistencia.entidades.Docs;
import mx.com.asteca.persistencia.entidades.DocsAlumnos;
import mx.com.asteca.persistencia.entidades.InstitutoContactos;
import mx.com.asteca.persistencia.entidades.Instructores;
import mx.com.asteca.persistencia.entidades.InstructoresDocumentos;
import mx.com.asteca.persistencia.entidades.Personas;
import mx.com.asteca.persistencia.entidades.Referencias;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

/**
 * @author JAMARO
 *
 */
@Repository
public class PersonasDAOImpl extends BaseDAOImpl<Personas, Integer> implements
		PersonaDAO {

	
	@Override
	public List<Personas> findBloqueados() throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Personas.class);
			criteria.add(Restrictions.eq("enabled", 0));
			List<Personas> list = criteria.list();
			return list;
		}catch(Exception e){
			throw new PersistenciaException("Error en findBloqueados:"+e.getMessage(),
					e);
		}
	}
	
	@Override
	public int aumentaContador(int idPersona) throws PersistenciaException{
		try{
			Personas p = findByPK(idPersona);
			int contador = p.getIntentos();
			contador++;
			p.setIntentos(contador);
			update(p);
			return contador;
		}catch(Exception e){
			throw new PersistenciaException("Error en aumentaContador:"+e.getMessage(),
					e);
		}
	}
	
	@Override
	public void reseteaContador(int idPersona) throws PersistenciaException{
		try{
			Personas p = findByPK(idPersona);
			p.setIntentos(0);
			update(p);
		}catch(Exception e){
			throw new PersistenciaException("Error en reseteaContador:"+e.getMessage(),
					e);
		}
	}
	
	@Override
	public void bloqueaUsuario(int idPersona) throws PersistenciaException{
		try{
			Personas p = findByPK(idPersona);
			p.setEnabled(0);
			update(p);
		}catch(Exception e){
			throw new PersistenciaException("Error en aumentaContador:"+e.getMessage(),
					e);
		}
	}
	
	@Override
	public void desbloqueaUsuario(int idPersona) throws PersistenciaException{
		try{
			Personas p = findByPK(idPersona);
			p.setEnabled(1);
			update(p);
		}catch(Exception e){
			throw new PersistenciaException("Error en aumentaContador:"+e.getMessage(),
					e);
		}
	}
	
	
	@Override
	public List<Docs> getDocumentosByAlumno(int idPersona) throws PersistenciaException{
		try{
			Personas personas = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Alumnos> setAlumnos = personas.getAlumnoses();
			if(setAlumnos.isEmpty()){
				throw new PersistenciaException("Esta persona: "+idPersona+" no es un alumno");
			}
			Alumnos alumnos = null;
			for(Alumnos a : setAlumnos){
				alumnos = a;
			}
			Set<DocsAlumnos> setDocsAlumnos = alumnos.getDocsAlumnoses();			
			if(setDocsAlumnos.isEmpty()){
				return new ArrayList<Docs>();
			}
			List<Docs> listaDocs = new ArrayList<Docs>();
			for(DocsAlumnos doc : setDocsAlumnos){
				listaDocs.add(doc.getDocs());
			}
			return listaDocs;
		}catch(Exception e){
			throw new PersistenciaException("Error en getDocumentosByAlumno:"+e.getMessage(),
					e);
		}
	}
	
	@Override
	public List<Docs> getDocumentosByInstructor(int idPersona) throws PersistenciaException{
		try{
			Personas personas = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Instructores> setInstructores = personas.getInstructoreses();
			if(setInstructores.isEmpty()){
				throw new PersistenciaException("Esta persona: "+idPersona+" no es un instructor");
			}
			Instructores instructores = null;
			for(Instructores a : setInstructores){
				instructores = a;
			}
			Set<InstructoresDocumentos> setDocsInstructir = instructores.getInstructoresDocumentoses();			
			if(setDocsInstructir.isEmpty()){
				return new ArrayList<Docs>();
			}
			List<Docs> listaDocs = new ArrayList<Docs>();
			for(InstructoresDocumentos doc : setDocsInstructir){
				listaDocs.add(doc.getDocumento());
			}
			return listaDocs;
		}catch(Exception e){
			throw new PersistenciaException("Error en getDocumentosByInstructor:"+e.getMessage(),
					e);
		}
	}
	
	
	@Override
	public Personas findByUserName(String userName)
	throws PersistenciaException {
		try {
			Criteria criteria = getSessionFactory().getCurrentSession()
					.createCriteria(Personas.class);
			criteria.add(Restrictions.eq("usuario", userName));
			Personas usuario =(Personas) criteria.uniqueResult();
			return usuario;
		} catch(Exception ex) {
			throw new PersistenciaException("Error obteniendo la lista en BD",
					ex);
		}
	}
	
	@Override
	public List<Personas> findActiveUsers() throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Personas.class);
			criteria.add(Restrictions.isNotNull("usuario"));
			criteria.add(Restrictions.isNotNull("password"));
			List<Personas> list = criteria.list();
			return list;
		}catch(Exception e){
			throw new PersistenciaException("Error en findActiveUsers: "+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isAlumno(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Alumnos> setAlumnos = persona.getAlumnoses();
			if(CollectionUtils.isEmpty(setAlumnos)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en isAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public int getIdAlumno(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Alumnos> setAlumnos = persona.getAlumnoses();
			for(Alumnos a : setAlumnos){
				return a.getIdAlumno();
			}
			return 0;
		}catch(Exception e){
			throw new PersistenciaException("Error en getIdAlumno:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isAdministrativo(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Administrativos> setAdmins = persona.getAdministrativoses();
			if(CollectionUtils.isEmpty(setAdmins)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en isAdministrativo:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isInstructor(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Instructores> setInstructores = persona.getInstructoreses();
			if(CollectionUtils.isEmpty(setInstructores)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en isInstructor:"+e.getMessage(), e);
		}
	}
	
	@Override
	public int getIdInstructor(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Instructores> setInstructores = persona.getInstructoreses();
			for(Instructores i : setInstructores){
				return i.getIdInstructor();
			}
			return 0;
		}catch(Exception e){
			throw new PersistenciaException("Error en isInstructor:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isReferencia(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<Referencias> setInstructores = persona.getReferenciases();
			if(CollectionUtils.isEmpty(setInstructores)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en isReferencia:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean isContacto(int idPersona) throws PersistenciaException{
		try{
			Personas persona = (Personas) getSessionFactory().getCurrentSession().get(Personas.class, idPersona);
			Set<InstitutoContactos> setInstructores = persona.getInstitutoContactoses();
			if(CollectionUtils.isEmpty(setInstructores)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en isContacto:"+e.getMessage(), e);
		}
	}

}
